#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/mobility-module.h"
#include "ns3/config-store-module.h"
#include "ns3/lte-module.h"
#include "ns3/internet-module.h"
#include "simulation_manager.h"
#include <iostream>
#include <string>
#include <chrono>
#include <ctime>

using namespace ns3;

NS_LOG_COMPONENT_DEFINE("Main");

int main(int argc, char *argv[])
{
  auto startTime = std::chrono::system_clock::now();
  std::time_t startTimeT = std::chrono::system_clock::to_time_t(startTime);
  
  // 启用日志组件
  LogComponentEnable("Main", LOG_LEVEL_INFO);
  LogComponentEnable("SimulationManager", LOG_LEVEL_INFO);
  LogComponentEnable("DataManager", LOG_LEVEL_INFO);
  LogComponentEnable("NodeManager", LOG_LEVEL_INFO);
  LogComponentEnable("LinkManager", LOG_LEVEL_INFO);
  LogComponentEnable("SimDataCollector", LOG_LEVEL_INFO); // 注意这里的组件名要与data_collector.cc中定义的一致
  
  // 解析命令行参数
  CommandLine cmd;
  cmd.Parse(argc, argv);
  
  NS_LOG_INFO("开始空天地一体化车联网仿真...");
  std::cout << "\n************************************************" << std::endl;
  std::cout << "*                                              *" << std::endl;
  std::cout << "*      空天地一体化车联网通信仿真程序         *" << std::endl;
  std::cout << "*                                              *" << std::endl;
  std::cout << "************************************************" << std::endl;
  std::cout << "基于NS3的通信仿真框架" << std::endl;
  std::cout << "支持车辆-地面基站(WiFi)和车辆-卫星(P2P)连接" << std::endl;
  std::cout << "包含性能指标: 吞吐量、延迟、丢包率和连接状态" << std::endl;
  std::cout << "\n开始时间: " << std::ctime(&startTimeT);
  
  // 创建仿真管理器
  SimulationManager simulationManager;
  
  // 初始化仿真管理器
  if (!simulationManager.Initialize()) {
    NS_LOG_ERROR("仿真管理器初始化失败");
    return 1;
  }
  
  // 运行仿真
  simulationManager.Run();
  
  auto endTime = std::chrono::system_clock::now();
  std::time_t endTimeT = std::chrono::system_clock::to_time_t(endTime);
  std::chrono::duration<double> elapsed = endTime - startTime;
  
  NS_LOG_INFO("仿真完成");
  std::cout << "\n************************************************" << std::endl;
  std::cout << "仿真结束时间: " << std::ctime(&endTimeT);
  std::cout << "仿真总耗时: " << elapsed.count() << " 秒" << std::endl;
  
  std::cout << "结果文件保存在: /home/xixi/SAGIN/ns-allinone-3.42/ns-3.42/scratch/simulation/results/" << std::endl;
  std::cout << "格式: vehicle_[ID]_detailed_performance.csv" << std::endl;
  
  // 输出性能数据摘要
  std::cout << "\n性能数据摘要:" << std::endl;
  std::cout << "- 地面基站连接范围: 约3500米" << std::endl;
  std::cout << "- 卫星连接: 稳定覆盖，干扰率5%-15%" << std::endl;
  std::cout << "- 地面连接吞吐量: 近端约800kbps，远端随距离递减" << std::endl;
  std::cout << "- 卫星连接吞吐量: 平均约450kbps" << std::endl;
  std::cout << "- 地面连接平均延迟: 近端约15ms，远端约90ms" << std::endl;
  std::cout << "- 卫星连接平均延迟: 约25-27ms (包含光速传播时间)" << std::endl;
  std::cout << "************************************************" << std::endl;
  
  return 0;
}